import json
import uuid

import redis
from dashscope import Generation
from rest_framework.response import Response
from rest_framework.views import APIView

from boss import settings

redis_client = redis.Redis(
    host=settings.REDIS_CONFIG['host'],      # Redis主机地址
    port=settings.REDIS_CONFIG['port'],      # Redis端口
    db=settings.REDIS_CONFIG['db'],          # Redis数据库编号
    decode_responses=True,                   # 自动解码响应
    encoding='utf-8'                         # 强制使用UTF-8编码
)

#多轮对话视图API类
class MultiChatView(APIView):
    def post(self, request):
        conversation_id = request.data.get('conversation_id')
        message=request.data.get('message')
        if not message:
            return Response({'error': '消息不能为空'}, status=400)

        if not conversation_id:
            conversation_id ,messages=str(uuid.uuid4()),[]
        else:
            history=redis_client.get(f"qa:conversation:{conversation_id}")
            messages=json.loads(history) if history else []

        messages.append({'role': 'user', 'content': message})
        try:
            response = Generation.call(
                api_key="sk-2c036d80d14a443f8769e072bb09a2e1",
                model="qwen-plus",
                messages=messages,
                result_format="message"
            )
            assistant_message=response.output.choices[0].message.content
            messages.append({'role': 'assistant', 'content': assistant_message})
            redis_client.setex(f"qa:conversation:{conversation_id}",86400*7, json.dumps(messages))
            return Response({
                'conversation_id': conversation_id,
                'message': assistant_message,
                'messages': messages
            })
        except Exception as e:
            # 确保错误信息使用UTF-8编码，避免emoji字符导致的编码问题
            try:
                error_msg = str(e).encode('utf-8', errors='ignore').decode('utf-8')
            except UnicodeError:
                error_msg = "系统内部错误"
            return Response({'error': error_msg}, status=500)




#创建新对话
class CreateConversationView(APIView):
    def post(self, request):
        conversation_id=str(uuid.uuid4())
        title=request.data.get('title','新对话')
        #保存会话到redis
        session_info={
            'conversation_id': conversation_id,
            'title': title,
            'created_at': str(uuid.uuid4())[:8]  # 简化时间戳'
        }
        redis_client.setex(f"qa:conversation:{conversation_id}",86400*7, json.dumps([session_info]))
        return Response({
            'conversation_id': conversation_id,
            'title': title
        })


#获取对话历史
class GetConversationHistoryView(APIView):
    def get(self, request, conversation_id):
        history=redis_client.get(f"qa:conversation:{conversation_id}")
        session_info=redis_client.get(f"qa:session:{conversation_id}")
        if not history:
            return Response({'error': '对话不存在'}, status=404)
        messages=json.loads(history)
        session_data=json.loads(session_info)if session_info else None
        return Response({
            'conversation_id': conversation_id,
           'messages': messages,
           'session_info': session_data
        })



#获取对话列表
class ListConversationsView(APIView):
    def get(self, request):
        pattern="qa:session:*"
        keys=redis_client.keys(pattern)
        conversations=[]
        for key in keys:
            session_data=redis_client.get(key)
            session_info=json.loads(session_data)
            conversations.append(session_info)
        return Response({
            'conversations': conversations,
            'count': len(conversations)
        })





